![ターミナルからファイル名を一括で変更する](https://devio2023-media.developers.io/wp-content/uploads/2013/09/tool.png)
ターミナルからファイル名を一括で変更する
src/ ディレクトリ内の *.jsx というファイルを *.js に変更する
macOS のターミナルで普通の名前変更の場合
find src -name "*.jsx" | sed -e 's/\.jsx$/.js/' | xargs -I{} mv {}x {}
git でバージョン管理されているファイルの場合
find src -name "*.jsx" | sed -e 's/\.jsx$/.js/' | xargs -I{} git mv {}x {}
Linux の場合(動作未確認...)
find src -name "*.jsx" | sed -e 's/\.jsx$/.js/' | xargs -i git mv {}x {}
例
カレントディレクトリにこんなファイルがある場合に
$ ls -1 src/**/*.js* src/components/A.jsx src/components/B.jsx src/components/C/C.jsx src/components/D/D/D.jsx
↓を実行すると...
$ find src -name "*.jsx" | sed -e 's/\.jsx$/.js/' | xargs -I{} mv {}x {}
↓のように名前を変更してくれます。
$ ls -1 src/**/*.js* src/components/A.js src/components/B.js src/components/C/C.js src/components/D/D/D.js
解説
このワンライナーは3つのパートに別れています。
$ find src -name "*.jsx" | sed -e 's/\.jsx$/.js/' | xargs -I{} mv {}x {}
1. find src -name "*.jsx"
で名前が .jsx
で終わるファイルを見つけて一覧をリストアップする
$ find src -name "*.jsx" src/components/A.jsx src/components/B.jsx src/components/C/C.jsx src/components/D/D/D.jsx
2. | sed -e 's/\.jsx$/.js/'
の部分で、見つけたファイル名の一覧から .jsx
の部分を .js
に置き換える
ファイル名を 1 つずつ受け取って、 .jsx
を .js
に置き換える
$ find src -name "*.jsx" | sed -e 's/\.jsx$/.js/' src/components/A.js src/components/B.js src/components/C/C.js src/components/D/D/D.js
- ※ まだファイル名の変更はしてない
- ※ リストアップしたファイル名が変わってるだけです
- ※
's/\.jsx$/.js/'
の.jsx$
の部分は「正規表現」
3. 最後に | xargs -I{} mv {}x {}
の部分で、ファイル名を変更する
.js
に書き換えられたファイル名を 1 つずつ受け取りながら mv
コマンドで名前変更
$ ls -1 src/**/*.js* src/components/A.jsx src/components/B.jsx src/components/C/C.jsx src/components/D/D/D.jsx $ $ find src -name "*.jsx" | sed -e 's/\.jsx$/.js/' | xargs -I{} mv {}x {} $ $ ls -1 src/**/*.js* src/components/A.js src/components/B.js src/components/C/C.js src/components/D/D/D.js
| xargs -I{} mv {}x {}
の部分は実際には↓のコマンドに展開されて実行されます
mv src/components/A.jsx src/components/A.js mv src/components/B.jsx src/components/B.js mv src/components/C/C.jsx src/components/C/C.js mv src/components/D/D/D.jsx src/components/D/D/D.js
今回の場合 xargs
は受け取ったファイル名を使って、名前変更をする mv
コマンドを組み立てています
xargs
の-I{}
で{}
という文字列がファイル名に置き換えられるようになるxargs
がsrc/components/A.js
を受け取るmv {}x {}
の{}
がsrc/components/A.js
に置き換えられてmv src/components/A.jsx src/components/A.js
になるmv src/components/A.jsx src/components/A.js
を実行してファイル名を変更src/components/B.js
→mv src/components/B.jsx src/components/B.js
src/components/C/C.js
→mv src/components/C/C.jsx src/components/C/C.js
src/components/D/D/D.js
→mv src/components/D/D/D.jsx src/components/D/D/D.js
おしまい